# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# pylint: disable=E1102
# python3
"""Reads presentation data.

Retrieves a presentation and extracts the placeholders and the presentation's
title.
"""
import re


class PresentationReader(object):

    def __init__(self, slides_service, presentation_id):
        self._slides_service = slides_service
        self._presentation_id = presentation_id
        self._presentation = None

    def _InitPresentation(self):
        if not self._presentation:
            self._presentation = self._slides_service.presentations().get(
                presentationId=self._presentation_id).execute()

    def GetTitle(self):
        self._InitPresentation()
        return self._presentation.get('title')

    def GetAllPlaceholders(self):
        self._InitPresentation()
        slides = self._presentation.get('slides')
        placeholders = []
        for slide in slides:
            elements = slide.get('pageElements')
            for element in elements:
                shape = element.get('shape')
                table = element.get('table')
                # Skip page elements that aren't shapes or tables since they're
                # the only types that support text.
                if not shape and not table:
                    continue
                if shape:
                    placeholders += self._GetPlaceholdersFromText(
                        shape.get('text'))
                elif table:
                    rows = table.get('tableRows')
                    for row in rows:
                        cells = row.get('tableCells')
                        for cell in cells:
                            placeholders += self._GetPlaceholdersFromText(
                                cell.get('text'))
        # Return the unique placeholders
        seen = set()
        return [p for p in placeholders if not (p in seen or seen.add(p))]

    def _GetPlaceholdersFromText(self, text):
        if not text:
            return []
        placeholders = []
        elements = text.get('textElements')
        for element in elements:
            if element.get('textRun'):
                content = element.get('textRun').get('content')
                placeholders += re.findall('{.*?}', content)
        return placeholders
